import * as XLSX from 'xlsx'
import dayjs from 'dayjs'

/**
 * @param json 数据, 用于生成 Excel
 * @param header 表头
 * @param filename 文件名
 * @param sheetName sheet名, 默认是 'Sheet1'
 */
function json2excel(json, header, filename, sheetName = 'Sheet1') {
  // 实例化一个工作簿
  const book = XLSX.utils.book_new()
  // 实例化一个Sheet
  const sheet = XLSX.utils.json_to_sheet(json, {header})
  // 将Sheet写入工作簿
  XLSX.utils.book_append_sheet(book, sheet, sheetName)
  // 写入文件，触发浏览器的下载
  XLSX.writeFile(book, filename)
}

/**
 * @param file excel或csv 文件对象
 * @param encoding 若为 csv 需要指定文件编码方式 gbk 或 UTF-8
 * @param callback 回调, 处理得到的json对象
 */
function excel2json(file, encoding, callback) {
  let isCSV = false
  if (file && file.type === 'text/csv') {
    isCSV = true
  }
  if (isCSV) {
    // 文件类型是csv
    const reader = new FileReader()
    reader.readAsText(file, encoding)
    reader.onload = function(e) {
      const data = XLSX.read(e.target.result, {
        type: 'binary',
        raw: true,
        codepage: 936
      })
      const jsonData = {}
      // 遍历处理多个sheet
      if (data.SheetNames && data.SheetNames.length > 0) {
        for (let i = 0; i < data.SheetNames.length; i++) {
          const sheetName = data.SheetNames[i]
          // 将数据转为json对象，第一行会自动识别为列名
          jsonData[sheetName] = XLSX.utils.sheet_to_json(data.Sheets[sheetName])
        }
      }
      callback(jsonData)
    }
  } else {
    // 文件类型是xlsx
    const reader = new FileReader()
    reader.readAsBinaryString(file)
    reader.onload = function(e) {
      const data = XLSX.read(e.target.result, {
        type: 'binary'
      })
      const jsonData = {}
      // 遍历处理多个sheet
      if (data.SheetNames && data.SheetNames.length > 0) {
        for (let i = 0; i < data.SheetNames.length; i++) {
          const sheetName = data.SheetNames[i]
          // 将数据转为json对象，第一行会自动识别为列名
          jsonData[sheetName] = XLSX.utils.sheet_to_json(data.Sheets[sheetName])
        }
      }
      callback(jsonData)
    }
  }
}

function int2hexChar(i) {
  if (i >= 0 && i <= 9) {
    return i.toString()
  } else if (i >= 10 && i <= 15) {
    return String.fromCharCode(i - 10 + 65)
  } else {
    throw new Error(`无效的字符 ${i}`)
  }
}

function bytesToHex(param) {
  if (param?.length === 0) {
    return ''
  }
  const result = []
  for (const b of param) {
    result.push([int2hexChar((b & 0xF0) >> 4), int2hexChar(b & 0x0F)].join(''))
  }
  return result.join('')
}

export default {
  json2excel,
  excel2json,
  bytesToHex,
  dayjs
}
